﻿// Doc-Encode UTF8-BOM, Space(4), Unix(LF)
#include "himpp_v4.h"
#include "hiobj.h"
#include <string.h>

#include "hi_comm_vi.h"
#include "mpi_vi.h"


//////////////////////////////////////////////////////////////////////////
// 导出函数

static int hivi_SetDevAttr(lua_State* L)
{
    lua_Integer vi_dev = luaL_checkinteger(L, 1);
    hiobj_t* p_attr = lua_checkhiobj(L, 2, HIOBJ_mem1, "VI_DEV_ATTR_S");

    int ret = HI_MPI_VI_SetDevAttr((VI_DEV)vi_dev, (const VI_DEV_ATTR_S*)p_attr->data);

    lua_pushinteger(L, ret);
    return 1;   // 1 个返回值
}

static int hivi_GetDevAttr(lua_State* L)
{
    lua_Integer vi_dev = luaL_checkinteger(L, 1);

    hiobj_t* p_attr = new_hiobj_mem(L, HIOBJ_mem1, "VI_DEV_ATTR_S");

    int ret = HI_MPI_VI_GetDevAttr((VI_DEV)vi_dev, (VI_DEV_ATTR_S*)p_attr->data);

    lua_pushinteger(L, ret);
    lua_pushhiobj_table(L, p_attr);
    return 2;   // 2 个返回值
}

static int hivi_SetDevAttrEx(lua_State* L)
{
    lua_Integer vi_dev = luaL_checkinteger(L, 1);
    hiobj_t* p_attr = lua_checkhiobj(L, 2, HIOBJ_mem1, "VI_DEV_ATTR_EX_S");

    int ret = HI_MPI_VI_SetDevAttrEx((VI_DEV)vi_dev, (VI_DEV_ATTR_EX_S*)p_attr->data);

    lua_pushinteger(L, ret);
    return 1;   // 1 个返回值
}

static int hivi_GetDevAttrEx(lua_State* L)
{
    lua_Integer vi_dev = luaL_checkinteger(L, 1);

    hiobj_t* p_attr = new_hiobj_mem(L, HIOBJ_mem1, "VI_DEV_ATTR_EX_S");

    HI_S32 ret = HI_MPI_VI_GetDevAttrEx((VI_DEV)vi_dev, (VI_DEV_ATTR_EX_S*)p_attr->data);

    lua_pushinteger(L, ret);
    lua_pushhiobj_table(L, p_attr);

    return 2;   // 2 个返回值
}

static int hivi_EnableDev(lua_State* L)
{
    lua_Integer vi_dev = luaL_checkinteger(L, 1);

    HI_S32 ret = HI_MPI_VI_EnableDev((VI_DEV)vi_dev);

    lua_pushinteger(L, ret);
    return 1;
}

static int hivi_DisableDev(lua_State* L)
{
    lua_Integer vi_dev = luaL_checkinteger(L, 1);

    HI_S32 ret = HI_MPI_VI_DisableDev((VI_DEV)vi_dev);

    lua_pushinteger(L, ret);
    return 1;
}

/* 2 for vi pipe */

static int hivi_CreatePipe(lua_State* L)
{
    lua_Integer vi_pipe = luaL_checkinteger(L, 1);
    hiobj_t* p_attr = lua_checkhiobj(L, 2, HIOBJ_mem1, "VI_PIPE_ATTR_S");

    HI_S32 ret = HI_MPI_VI_CreatePipe((VI_PIPE)vi_pipe, (const VI_PIPE_ATTR_S*)p_attr->data);

    lua_pushinteger(L, ret);
    return 1;
}

static int hivi_DestroyPipe(lua_State* L)
{
    lua_Integer vi_pipe = luaL_checkinteger(L, 1);

    HI_S32 ret = HI_MPI_VI_DestroyPipe(vi_pipe);

    lua_pushinteger(L, ret);
    return 1;
}

static int hivi_SetPipeAttr(lua_State* L)
{
    lua_Integer vi_pipe = luaL_checkinteger(L, 1);
    hiobj_t* p_attr = lua_checkhiobj(L, 2, HIOBJ_mem1, "VI_PIPE_ATTR_S");

    HI_S32 ret = HI_MPI_VI_SetPipeAttr((VI_PIPE)vi_pipe, (const VI_PIPE_ATTR_S*)p_attr->data);

    lua_pushinteger(L, ret);
    return 1;
}

static int hivi_GetPipeAttr(lua_State* L)
{
    lua_Integer vi_pipe = luaL_checkinteger(L, 1);
    
    hiobj_t* p_attr = new_hiobj_mem(L, HIOBJ_mem1, "VI_PIPE_ATTR_S");

    HI_S32 ret = HI_MPI_VI_GetPipeAttr((VI_PIPE)vi_pipe, (VI_PIPE_ATTR_S*)p_attr->data);

    lua_pushinteger(L, ret);
    lua_pushhiobj_table(L, p_attr);
    return 2;
}

static int hivi_StartPipe(lua_State* L)
{
    lua_Integer vi_pipe = luaL_checkinteger(L, 1);

    HI_S32 ret = HI_MPI_VI_StartPipe((VI_PIPE)vi_pipe);

    lua_pushinteger(L, ret);
    return 1;
}

static int hivi_StopPipe(lua_State* L)
{
    lua_Integer vi_pipe = luaL_checkinteger(L, 1);

    HI_S32 ret = HI_MPI_VI_StopPipe((VI_PIPE)vi_pipe);

    lua_pushinteger(L, ret);
    return 1;
}

/* 3 for vi chn */
static int hivi_SetChnAttr(lua_State* L)
{
    lua_Integer vi_pipe = luaL_checkinteger(L, 1);
    lua_Integer vi_chn = luaL_checkinteger(L, 2);
    hiobj_t* p_attr = lua_checkhiobj(L, 3, HIOBJ_mem1, "VI_CHN_ATTR_S");

    HI_S32 ret = HI_MPI_VI_SetChnAttr((VI_PIPE)vi_pipe, (VI_CHN)vi_chn, (const VI_CHN_ATTR_S*)p_attr->data);

    lua_pushinteger(L, ret);
    return 1;
}

static int hivi_GetChnAttr(lua_State* L)
{
    lua_Integer vi_pipe = luaL_checkinteger(L, 1);
    lua_Integer vi_chn = luaL_checkinteger(L, 2);

    hiobj_t* p_attr = new_hiobj_mem(L, HIOBJ_mem1, "VI_CHN_ATTR_S");

    HI_S32 ret = HI_MPI_VI_GetChnAttr((VI_PIPE)vi_pipe, (VI_CHN)vi_chn, (VI_CHN_ATTR_S*)p_attr->data);

    lua_pushinteger(L, ret);
    lua_pushhiobj_table(L, p_attr);

    return 2;   // 2 个返回值
}

static int hivi_EnableChn(lua_State* L)
{
    lua_Integer vi_pipe = luaL_checkinteger(L, 1);
    lua_Integer vi_chn = luaL_checkinteger(L, 2);

    HI_S32 ret = HI_MPI_VI_EnableChn((VI_PIPE)vi_pipe, (VI_CHN)vi_chn);

    lua_pushinteger(L, ret);
    return 1;
}

static int hivi_DisableChn(lua_State* L)
{
    lua_Integer vi_pipe = luaL_checkinteger(L, 1);
    lua_Integer vi_chn = luaL_checkinteger(L, 2);

    HI_S32 ret = HI_MPI_VI_DisableChn((VI_PIPE)vi_pipe, (VI_CHN)vi_chn);

    lua_pushinteger(L, ret);
    return 1;
}

//////////////////////////////////////////////////////////////////////////
// 常量定义

static void hivi_define(lua_State* L)
{
    // VI_USERPIC_MODE_E
    HIMPP_DEFINE_INTEGER(L, VI_USERPIC_MODE_PIC);
    HIMPP_DEFINE_INTEGER(L, VI_USERPIC_MODE_BGC);
    HIMPP_DEFINE_INTEGER(L, VI_USERPIC_MODE_BUTT);
}

//////////////////////////////////////////////////////////////////////////
// 库

KLB_API int luaopen_himpp_hivi(lua_State* L)
{
    static luaL_Reg lib[] =
    {
        /* 1 for vi device */
        { "SetDevAttr",         hivi_SetDevAttr },
        { "GetDevAttr",         hivi_GetDevAttr },
        { "SetDevAttrEx",       hivi_SetDevAttrEx },
        { "GetDevAttrEx",       hivi_GetDevAttrEx },
        { "EnableDev",          hivi_EnableDev },
        { "DisableDev",         hivi_DisableDev },

        /* 2 for vi pipe */
        { "CreatePipe",         hivi_CreatePipe },
        { "DestroyPipe",        hivi_DestroyPipe },
        { "SetPipeAttr",        hivi_SetPipeAttr },
        { "GetPipeAttr",        hivi_GetPipeAttr },
        { "StartPipe",          hivi_StartPipe },
        { "StopPipe",           hivi_StopPipe },

        /* 3 for vi chn */
        { "SetChnAttr",         hivi_SetChnAttr },
        { "GetChnAttr",         hivi_GetChnAttr },
        { "EnableChn",          hivi_EnableChn },
        { "DisableChn",         hivi_DisableChn },

        { NULL,                 NULL }
    };

    // 创建导出库函数
    luaL_newlib(L, lib);

    // 常量
    hivi_define(L);

    return 1;
}
